package com.monitor.ui.controller;

import com.monitor.service.BrowserMonitorService;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.util.Optional;

/**
 * 防护中心控制器
 * 负责网站过滤和关键词过滤功能的实现
 */
public class ProtectionPanelController implements Initializable {
    
    // 网站过滤相关组件
    @FXML
    private TextArea websiteFilterDescription;
    @FXML
    private RadioButton websiteFilterEnabledBtn;
    @FXML
    private RadioButton websiteFilterDisabledBtn;
    @FXML
    private ToggleGroup websiteFilterToggleGroup;
    @FXML
    private TextField websiteInput;
    @FXML
    private ListView<String> websiteListView;
    @FXML
    private Button addWebsiteBtn;
    @FXML
    private Button removeWebsiteBtn;
    @FXML
    private Button applyWebsiteFilterBtn;
    
    // 关键词过滤相关组件
    @FXML
    private TextArea keywordFilterDescription;
    @FXML
    private RadioButton keywordFilterEnabledBtn;
    @FXML
    private RadioButton keywordFilterDisabledBtn;
    @FXML
    private ToggleGroup keywordFilterToggleGroup;
    @FXML
    private TextField keywordInput;
    @FXML
    private ListView<String> keywordListView;
    @FXML
    private Button addKeywordBtn;
    @FXML
    private Button removeKeywordBtn;
    @FXML
    private Button applyKeywordFilterBtn;
    
    // 数据模型
    private ObservableList<String> websiteBlacklist = FXCollections.observableArrayList();
    private ObservableList<String> keywordBlacklist = FXCollections.observableArrayList();
    
    // 浏览器监控服务
    private BrowserMonitorService browserMonitorService;
    
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // 加载示例关键词数据
        loadSampleKeywords();
        
        // 初始化浏览器监控服务，传入关键词黑名单
        browserMonitorService = BrowserMonitorService.getInstance(new ArrayList<>(keywordBlacklist));
        
        // 初始化网站过滤组件
        initWebsiteFilter();
        
        // 初始化关键词过滤组件
        initKeywordFilter();
        
        // 加载示例网站数据
        loadSampleWebsites();
        
        // 设置过滤状态变化监听器
        websiteFilterToggleGroup.selectedToggleProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue != null) {
                boolean isEnabled = newValue == websiteFilterEnabledBtn;
                updateWebsiteFilterStatus(isEnabled);
            }
        });
        
        keywordFilterToggleGroup.selectedToggleProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue != null) {
                boolean isEnabled = newValue == keywordFilterEnabledBtn;
                updateKeywordFilterStatus(isEnabled);
            }
        });
    }
    
    /**
     * 初始化网站过滤组件
     */
    private void initWebsiteFilter() {
        websiteListView.setItems(websiteBlacklist);
        websiteFilterDescription.setText("网站过滤功能可以阻止用户访问黑名单中的网站。启用后，当用户尝试访问黑名单中的网站时，系统会阻止访问并显示警告信息。");
        websiteFilterDescription.setEditable(false);
    }
    
    /**
     * 初始化关键词过滤组件
     */
    private void initKeywordFilter() {
        keywordListView.setItems(keywordBlacklist);
        keywordFilterDescription.setText("关键词过滤功能可以检测网页内容中的敏感关键词。启用后，当检测到页面包含黑名单中的关键词时，系统会阻止访问并显示警告信息。");
        keywordFilterDescription.setEditable(false);
    }
    
    /**
     * 加载示例网站数据
     */
    private void loadSampleWebsites() {
        // 添加一些示例网站到黑名单
        websiteBlacklist.addAll(
            "example-adult-site.com",
            "gambling-example.com",
            "violence-content.net",
            "inappropriate-videos.org",
            "blocked-social-media.cn"
        );
    }
    
    /**
     * 加载示例关键词数据
     */
    private void loadSampleKeywords() {
        // 添加一些示例关键词到黑名单
        keywordBlacklist.addAll(
            "暴力",
            "赌博",
            "色情",
            "毒品",
            "反动"
        );
    }
    
    /**
     * 更新网站过滤状态
     */
    private void updateWebsiteFilterStatus(boolean isEnabled) {
        System.out.println("网站过滤状态: " + (isEnabled ? "启用" : "禁用"));
        // 更新浏览器监控服务的网站过滤配置
        if (browserMonitorService != null) {
            browserMonitorService.updateWebsiteFilterConfig(isEnabled, new ArrayList<>(websiteBlacklist));
        }
    }
    
    /**
     * 更新关键词过滤状态
     */
    private void updateKeywordFilterStatus(boolean isEnabled) {
        System.out.println("关键词过滤状态: " + (isEnabled ? "启用" : "禁用"));
        // 更新浏览器监控服务的关键词过滤配置
        if (browserMonitorService != null) {
            browserMonitorService.updateKeywordFilterConfig(isEnabled, new ArrayList<>(keywordBlacklist));
        }
    }
    
    /**
     * 添加网站到黑名单按钮点击事件
     */
    @FXML
    private void onAddWebsiteClicked() {
        String website = websiteInput.getText().trim();
        if (!website.isEmpty() && !websiteBlacklist.contains(website)) {
            websiteBlacklist.add(website);
            websiteInput.clear();
            System.out.println("添加网站到黑名单: " + website);
        } else if (websiteBlacklist.contains(website)) {
            showAlert("添加失败", "该网站已在黑名单中");
        } else {
            showAlert("添加失败", "请输入有效的网站域名");
        }
    }
    
    /**
     * 从黑名单中删除所选网站按钮点击事件
     */
    @FXML
    private void onRemoveWebsiteClicked() {
        String selectedWebsite = websiteListView.getSelectionModel().getSelectedItem();
        if (selectedWebsite != null) {
            // 确认删除
            boolean confirmed = showConfirmation("确认删除", "确定要从黑名单中删除该网站吗？\n" + selectedWebsite);
            if (confirmed) {
                websiteBlacklist.remove(selectedWebsite);
                System.out.println("从黑名单中删除网站: " + selectedWebsite);
            }
        } else {
            showAlert("删除失败", "请先选择要删除的网站");
        }
    }
    
    /**
     * 应用网站过滤设置按钮点击事件
     */
    @FXML
    private void onApplyWebsiteFilterClicked() {
        boolean isEnabled = websiteFilterEnabledBtn.isSelected();
        saveWebsiteFilterSettings(isEnabled);
        
        showAlert("设置已保存", "网站过滤设置已成功应用");
    }
    
    /**
     * 保存网站过滤设置
     */
    private void saveWebsiteFilterSettings(boolean isEnabled) {
        // 这里实现保存设置的逻辑
        // 实际项目中可能需要保存到配置文件或数据库
        System.out.println("保存网站过滤设置: " + (isEnabled ? "启用" : "禁用"));
        System.out.println("黑名单网站数量: " + websiteBlacklist.size());
        
        // 更新浏览器监控服务配置
        updateWebsiteFilterStatus(isEnabled);
        
        // 同步黑名单到监控服务
        if (browserMonitorService != null) {
            browserMonitorService.updateWebsiteFilterConfig(isEnabled, new ArrayList<>(websiteBlacklist));
        }
    }
    
    /**
     * 添加关键词到黑名单按钮点击事件
     */
    @FXML
    private void onAddKeywordClicked() {
        String keyword = keywordInput.getText().trim();
        if (!keyword.isEmpty() && !keywordBlacklist.contains(keyword)) {
            keywordBlacklist.add(keyword);
            keywordInput.clear();
            System.out.println("添加关键词到黑名单: " + keyword);
        } else if (keywordBlacklist.contains(keyword)) {
            showAlert("添加失败", "该关键词已在黑名单中");
        } else {
            showAlert("添加失败", "请输入有效的关键词");
        }
    }
    
    /**
     * 从黑名单中删除所选关键词按钮点击事件
     */
    @FXML
    private void onRemoveKeywordClicked() {
        String selectedKeyword = keywordListView.getSelectionModel().getSelectedItem();
        if (selectedKeyword != null) {
            // 确认删除
            boolean confirmed = showConfirmation("确认删除", "确定要从黑名单中删除该关键词吗？\n" + selectedKeyword);
            if (confirmed) {
                keywordBlacklist.remove(selectedKeyword);
                System.out.println("从黑名单中删除关键词: " + selectedKeyword);
            }
        } else {
            showAlert("删除失败", "请先选择要删除的关键词");
        }
    }
    
    /**
     * 应用关键词过滤设置按钮点击事件
     */
    @FXML
    private void onApplyKeywordFilterClicked() {
        boolean isEnabled = keywordFilterEnabledBtn.isSelected();
        saveKeywordFilterSettings(isEnabled);
        
        showAlert("设置已保存", "关键词过滤设置已成功应用");
    }
    
    /**
     * 保存关键词过滤设置
     */
    private void saveKeywordFilterSettings(boolean isEnabled) {
        // 这里实现保存设置的逻辑
        // 实际项目中可能需要保存到配置文件或数据库
        System.out.println("保存关键词过滤设置: " + (isEnabled ? "启用" : "禁用"));
        System.out.println("黑名单关键词数量: " + keywordBlacklist.size());
        
        // 更新浏览器监控服务配置
        updateKeywordFilterStatus(isEnabled);
        
        // 同步黑名单到监控服务
        if (browserMonitorService != null) {
            browserMonitorService.updateKeywordFilterConfig(isEnabled, new ArrayList<>(keywordBlacklist));
        }
    }
    
    /**
     * 显示提示对话框
     */
    private void showAlert(String title, String content) {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle(title);
        alert.setHeaderText(null);
        alert.setContentText(content);
        alert.showAndWait();
    }
    
    /**
     * 显示确认对话框
     * @return 用户是否确认
     */
    private boolean showConfirmation(String title, String content) {
        Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
        alert.setTitle(title);
        alert.setHeaderText(null);
        alert.setContentText(content);
        
        Optional<ButtonType> result = alert.showAndWait();
        return result.isPresent() && result.get() == ButtonType.OK;
    }
}